// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/base/ime/mock_input_method.h"

#include "ui/base/ime/input_method_delegate.h"
#include "ui/events/event.h"

namespace ui {

MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate)
    : text_input_client_(NULL)
    , delegate_(delegate)
{
}

MockInputMethod::~MockInputMethod()
{
    FOR_EACH_OBSERVER(InputMethodObserver, observer_list_,
        OnInputMethodDestroyed(this));
}

void MockInputMethod::SetDelegate(internal::InputMethodDelegate* delegate)
{
    delegate_ = delegate;
}

void MockInputMethod::SetFocusedTextInputClient(TextInputClient* client)
{
    if (text_input_client_ == client)
        return;
    text_input_client_ = client;
    if (client)
        OnTextInputTypeChanged(client);
}

void MockInputMethod::DetachTextInputClient(TextInputClient* client)
{
    if (text_input_client_ == client) {
        text_input_client_ = NULL;
    }
}

TextInputClient* MockInputMethod::GetTextInputClient() const
{
    return text_input_client_;
}

void MockInputMethod::DispatchKeyEvent(ui::KeyEvent* event)
{
    ignore_result(delegate_->DispatchKeyEventPostIME(event));
}

void MockInputMethod::OnFocus()
{
    FOR_EACH_OBSERVER(InputMethodObserver, observer_list_, OnFocus());
}

void MockInputMethod::OnBlur()
{
    FOR_EACH_OBSERVER(InputMethodObserver, observer_list_, OnBlur());
}

bool MockInputMethod::OnUntranslatedIMEMessage(const base::NativeEvent& event,
    NativeEventResult* result)
{
    if (result)
        *result = NativeEventResult();
    return false;
}

void MockInputMethod::OnTextInputTypeChanged(const TextInputClient* client)
{
    FOR_EACH_OBSERVER(InputMethodObserver,
        observer_list_,
        OnTextInputTypeChanged(client));
    FOR_EACH_OBSERVER(InputMethodObserver,
        observer_list_,
        OnTextInputStateChanged(client));
}

void MockInputMethod::OnCaretBoundsChanged(const TextInputClient* client)
{
    FOR_EACH_OBSERVER(InputMethodObserver,
        observer_list_,
        OnCaretBoundsChanged(client));
}

void MockInputMethod::CancelComposition(const TextInputClient* client)
{
}

void MockInputMethod::OnInputLocaleChanged()
{
}

std::string MockInputMethod::GetInputLocale()
{
    return "";
}

TextInputType MockInputMethod::GetTextInputType() const
{
    return TEXT_INPUT_TYPE_NONE;
}

TextInputMode MockInputMethod::GetTextInputMode() const
{
    return TEXT_INPUT_MODE_DEFAULT;
}

int MockInputMethod::GetTextInputFlags() const
{
    return 0;
}

bool MockInputMethod::CanComposeInline() const
{
    return true;
}

bool MockInputMethod::IsCandidatePopupOpen() const
{
    return false;
}

void MockInputMethod::ShowImeIfNeeded()
{
    FOR_EACH_OBSERVER(InputMethodObserver, observer_list_, OnShowImeIfNeeded());
}

void MockInputMethod::AddObserver(InputMethodObserver* observer)
{
    observer_list_.AddObserver(observer);
}

void MockInputMethod::RemoveObserver(InputMethodObserver* observer)
{
    observer_list_.RemoveObserver(observer);
}

} // namespace ui
